package app.controllers;

import app.models.Usuario;
import app.services.FuncionarioService;
import app.services.LogService;
import app.services.PacienteService;
import app.services.UsuarioService;
import app.util.Constants;
import br.com.caelum.vraptor.Get;
import br.com.caelum.vraptor.Post;
import br.com.caelum.vraptor.Resource;
import br.com.caelum.vraptor.Result;
import br.com.caelum.vraptor.Validator;

@Resource
public class UsuarioController extends Controller{

	private final Result result;
	private final UsuarioService service;
	private final Validator validator;
	private final FuncionarioService funcionarioService;
	private final PacienteService pacienteService;
	private final LogService logService;
	
	public UsuarioController(Result result, Validator validator, UsuarioService service, 
			FuncionarioService funcionarioService, PacienteService pacienteService, LogService logService) {
		
		this.result = result;
		this.validator = validator;
		this.service = service;
		this.funcionarioService = funcionarioService;
		this.pacienteService = pacienteService;
		this.logService = logService;
	}
	
	
	@Get("/usuarios")
	public void index() {
		result.include("usuarioList", service.findAllOrdered());
		result.include("lastUsuariosRegistered", service.findLasUsuarios());	
	}
	
	
	@Get("/usuarios/find")
	public void index(String filter) {
		result.include("filter", filter);
		result.include("usuarioList", service.findUsuariosByFilter(filter));
		
		result.forwardTo("/WEB-INF/jsp/usuario/table.jsp");
	}
	
	
	@Get("/usuarios/{id}/edit")
	public void edit(Long id) {
		result.include("funcionario", funcionarioService.findByUserId(id));
		result.include("paciente", pacienteService.findByUserId(id));
		result.include("usuario", service.find(id));
	}
	
	
	@Post("/usuarios/update")
	public void update(Long userId, String usuario, String senha) {
		
		logService.createLog(Constants.UPDATE_USUARIO + userId);
		
		Usuario user = service.find(userId);
		
		user.setUsuario(usuario);
		user.setSenha(senha);
		
		validator.validate(user);
		validator.onErrorForwardTo(this).edit(user.getId());
		
		service.update(user);
		
		result.forwardTo(this).index();
	}
	
	
	@Get("/usuarios/{id}/updateStatus")
	public void updateStatus(Long id) {
		
		logService.createLog(Constants.UPDATE_STATUS_USUARIO + id);
		
		Usuario usuario = service.find(id);
		
		service.activeOrInactiveStatus(usuario);
		
		service.update(usuario);
		result.forwardTo(this).index();
	}
	
	
	@Get("/usuarios/{id}/show")
	public void show(Long id) {
		result.include("usuario", service.find(id));
	}
	
}